﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
namespace Model
{
    public class Auktion
    {
        // Auktions delegatet
        public delegate void D_budHandler(string besked, string ip, int gældendeBud);
        public D_budHandler d_budhandler;

        // Variabler
        
        //Disse variabler skulle bruges hvis aktionshuset skulle udvides til at kunne håndtere flere auktioner
        //private static int staticAuktionId = 0;
        //private int auktionId;

        private bool kører = true;
        private int aktuelPris;

        private string ip;
        
        private object lockobject = new object();
        private Vare vare;

        private HammerSlag hammerSlag;
        private Thread hammerSlagTråd;


        //Konstruktør
        public Auktion(Vare vare)
        {

            this.vare = vare;
            this.aktuelPris = vare.StartPris;
        }

        //Denne metode laver et bud, ved først at låse og derefter checke om budet er højere end det nuværende bud
        //hvis dette er tilfældet sætter den de medfølgende variabler ip og bud og overskriver de nuværende ip og bud
        //derefter går den med en ifsætning ind og checker på om der er en tråd instansieret og om en er ilive
        //er dette tilfældet stopper den tråden med hammerslag.Stop metoden. Efter dette er udført startes et nyt
        //hammerslag og en ny hammerslagstråd, samt sendet eventet NytBud med.
        public bool Byd(string ip, int bud)
        {
            lock (lockobject)
            {
                //Tjekker om det nye bud er det højste der er kommet
                if (bud > aktuelPris && d_budhandler != null)
                {
                    this.ip = ip;
                    this.aktuelPris = bud;


                    if (hammerSlagTråd!= null && hammerSlagTråd.IsAlive)
                        hammerSlag.Stop();


                    hammerSlag = new HammerSlag(this, this.ip, this.aktuelPris);
                    hammerSlagTråd = new Thread(new ThreadStart(hammerSlag.HammerSlagMetode));
                    hammerSlagTråd.Start();

                    d_budhandler("NytBud", this.ip, this.aktuelPris);
                    return true;
                }
                return false;
            }
        }

        //Get- Set- Metoder
        public Vare Vare
        {
            get { return vare; }
            set { vare = value; }
        }

        public int AktuelPris
        {
            get { return aktuelPris; }
            set { aktuelPris = value; }
        }

        public string Ip
        {
            get { return ip; }
            set { ip = value; }
        }

        //Denne Get- Set skulle bruges hvis aktionshuset skulle udvides til at kunne håndtere flere auktioner
        //public int AukltionId
        //{
        //    get { return auktionId; }
        //    set { auktionId = value; }
        //}
    }
}
